package com.ulaiber.web.service;

import java.util.List;
import java.util.Map;

import com.ulaiber.web.model.ResultInfo;
import com.ulaiber.web.model.attendance.Attendance;
import com.ulaiber.web.model.attendance.AttendancePatchClock;
import com.ulaiber.web.model.attendance.AttendanceRule;

/** 
 * 考勤记录业务逻辑接口
 *
 * @author  huangguoqing
 * @date 创建时间：2017年8月11日 上午11:07:03
 * @version 1.0 
 * @since 
 */
public interface AttendanceService {
	
	/**
	 * 新增考勤记录
	 * @param attend
	 * @return
	 */
	ResultInfo save(Attendance attend, String device, String location, boolean isOutClock, String remark, AttendanceRule rule);
	
	/**
	 * 查询指定的day是否是休息肉
	 * @param day yyyy-MM-dd
	 * @param rule 考勤规则
	 * @return boolean
	 */
	boolean isRestDay(String day, AttendanceRule rule);
	
	/**
	 * 根据条件查询记录
	 * @param params
	 * @return
	 */
	List<Attendance> getRecordsByCond(Map<String, Object> params);
	
	/**
	 * 刷新地理位置坐标
	 * @return
	 */
	ResultInfo refreshLocation(String longitude, String latitude, AttendanceRule rule);
	
	/**
	 * 根据条件获取记录数
	 * @param params
	 * @return
	 */
	int getCountBycond(Map<String, Object> params);
	
	/**
	 * 根据用户id获取考勤记录
	 * @param params
	 * @return
	 */
	List<Attendance> getRecordsByDateAndUserId(String dateBegin, String dateEnd, long userId);
	
	/**
	 * 根据date和手机号查询考勤记录
	 * @param dateBegin yyyy-MM-dd
	 * @param dateEnd   yyyy-MM-dd
	 * @param mobile
	 * @return
	 */
	List<Attendance> getRecordsByDateAndMobile(String dateBegin, String dateEnd, String mobile);
	
	/**
	 * 更新打卡记录
	 * @param record
	 * @return
	 */
	boolean updateClockOffInfo(Attendance record);
	
	/**
	 * 批量删除记录
	 * @param rids
	 * @return
	 */
	boolean deleteRecordsByRids(List<Long> rids);
	
	/**
	 * 根据月份查询考勤记录
	 * @param month
	 */
	Map<String, Object> getRecordsByMonthAndUserId(String month, long userId, AttendanceRule rule);
	
	/**
	 * 获取一段时间内的工作小时数
	 * @param startDateTime yyyy-MM-dd HH:mm
	 * @param endDateTime   yyyy-MM-dd HH:mm
	 * @param rule
	 * @return
	 */
	double getHoursByDate(String startDateTime, String endDateTime, AttendanceRule rule);
	
	/**
	 * 获取一段时间内的工作小时数
	 * @param startDate yyyy-MM-dd
	 * @param endDate   yyyy-MM-dd 
	 * @param rule
	 * @return Map<String, Object>
	 */
	Map<String, Object> getDaysByDate(String startDate, String startType, String endDate, String endType, AttendanceRule rule);
	
	/**
	 * 补卡
	 * @param params
	 * @return
	 */
	boolean patchClock(AttendancePatchClock patchClock);
	
	/**
	 * 获取考勤异常的次数(迟到，早退，未打卡)
	 * @param userId
	 * @return
	 */
	int getAbnormalCountByUserId(long userId);
	
}
